package com.kamistoat.meimeistore.product.controller;

import java.util.Arrays;
import java.util.List;

//import org.apache.shiro.authz.annotation.RequiresPermissions;
import com.kamistoat.meimeistore.product.service.CategoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.kamistoat.meimeistore.product.entity.CategoryEntity;
import com.kamistoat.common.utils.R;


/**
 * 商品三级分类
 *
 * @author kamistoat
 * @email linjianshanke@163.com
 * @date 2021-09-12 15:16:42
 */
@RestController
@RequestMapping("meimeistoreproduct/category")
public class CategoryController {
    @Autowired
    private CategoryService categoryService;

    /**
     * 修改了自动生成的list方法
     * 查询出所有分类以及子分类，并以树形结构进行组装
     * 需要在服务层编写一个新的方法listWithTree
     * <p>
     * 不需要任何请求参数，就是查询所有内容
     */
    @RequestMapping("/list/tree")
    //@RequiresPermissions("meimeistoreproduct:category:list")
    public R list() {
        List<CategoryEntity> categoryEntities = categoryService.listWithTree();
        // 注意这里往返回的json文件中存放到键值对
        // 也就是最后前端获取的json文件中，存在一个键名为allcategory，值为全部菜单信息的 键值对
        // 这决定了到时候前端寻找哪个键名，把菜单信息取出来
        return R.ok().put("allcategory", categoryEntities);
    }


    /**
     * 查询单条数据信息。这里就是查询单条菜单信息
     */
    @RequestMapping("/info/{catId}")
    //@RequiresPermissions("meimeistoreproduct:category:info")
    public R info(@PathVariable("catId") Long catId) {
        CategoryEntity category = categoryService.getById(catId);

        return R.ok().put("singlecategory", category);
    }

    /**
     * 保存
     */
    @RequestMapping("/save")
    //@RequiresPermissions("meimeistoreproduct:category:save")
    public R save(@RequestBody CategoryEntity category) {
        categoryService.save(category);
        return R.ok();
    }

    /**
     * 批量修改，主要用于对拖拽数据的修改。由于主要修改排序值，因此起名为sort
     *
     * @param category 前端发送来的一个json文件，是由一个列表封装而成，列表的元素就是CategoryEntity
     */
    @RequestMapping("/update/sort")
    //@RequiresPermissions("meimeistoreproduct:category:update")
    public R updateSort(@RequestBody CategoryEntity[] category) {
        // 自动生成的Dao中具有按列表修改的功能
        // 接收collection类输入，使用Array.toList将列表转换成collection
        categoryService.updateBatchById(Arrays.asList(category));
        return R.ok();
    }

    /**
     * 修改原来的修改方法，因为涉及到冗余同步
     */
    @RequestMapping("/update")
    //@RequiresPermissions("meimeistoreproduct:category:update")
    public R update(@RequestBody CategoryEntity category) {
        categoryService.updateDetail(category);
        return R.ok();
    }

    /**
     * 删除
     */
    @RequestMapping("/delete")
    //@RequiresPermissions("meimeistoreproduct:category:delete")
    public R delete(@RequestBody Long[] catIds) {
        categoryService.removeMenuByIds(Arrays.asList(catIds));
        return R.ok();
    }

}
